# -*- coding: utf-8 -*-
# 递归函数：fact(n)函数，求n!
def fact(n):
    if n == 1:
        return 1
    return n*fact(n-1)
print(fact(5))
print(fact(100))
# print(fact(1000))#导致栈溢出

# 解决递归调用栈溢出的方法是通过尾递归优化，尾递归是指，在函数返回的时候，调用自身本身，并且，return语句不能包含表达式。
# 尾递归方式如下：
def fact1(n):
    return fact_iter(n, 1)
def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num-1, num*product)
print(fact1(6))
print(fact1(100))

